利用 Fetch API
、非同步載入的方式,並配合正規表達式處理字串,實現使用者輸入的城市名稱時動態地查找相對應的資料。
接資料
建立一個變數,預設是陣列
const cities = [];
使用 Fetch
取得 json 資料
fetch(endpoint)
.then(blob => blob.json())
使用 淺拷貝
(MDN) 將接收的資料 push
進cities
變數中
.then(data => cities.push(...data));// (...data) ES6 淺拷貝
建立 function findMatches
專門來找查找字與城市的關聯,之後再調用它
function findMatches(wordToMatch, cities) {
return cities.filter(place => {
const regex = new RegExp(wordToMatch, 'gi'); // g -> 全部, i -> 不分大小寫
return place.city.match(regex) || place.state.match(regex)
});
}
建立 function numberWithCommas
,使用正規表達式將字串轉換成有逗點的數字,以增加數字的可讀性。Ex: 將數字 1234567 轉換為 1,234,567。
function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
處理 input
輸入的資訊並顯示資料
綁定事件 change
、 keyup
searchInput.addEventListener('change', inputHandler);
searchInput.addEventListener('keyup', inputHandler);
事件觸發時的邏輯
製作上面的 callback inputHandler
function inputHandler() {}
當使用者打字進去就會調用 findMatches
const matchArray = findMatches(this.value, cities);
渲染到 html
:使用 map
跑 place,有相同的地區或城市時,用 replace
去替換值
const html = matchArray.map(place => {
const regex = new RegExp(this.value, 'gi');
const cityName = place.city.replace(regex, `<span class="hl">${this.value}</span>`);
const stateName = place.state.replace(regex, `<span class="hl">${this.value}</span>`);
})
將這個 inputHandler
使用 樣板字串
把字呈現,並且在數字的地方調用 numberWithCommas
return `
<li>
<span class="name">${cityName}, ${stateName}</span>
<span class="population">${numberWithCommas(place.population)}</span>
</li>
`;
用 join
去連接每個資訊
const html = matchArray.map(place => {
...
}).join('');
將生成的 HTML 字串插入到 suggestions
元素中,以顯示搜尋結果
suggestions.innerHTML = html;
正則表達式學習資訊
Fetch 與 Axios
Fetch ( MDN )
Axios (GitHub)